package com.taotao.manage.service;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.github.abel533.entity.Example;
import com.github.abel533.mapper.Mapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.manage.pojo.BasePojo;

/**
 * 抽象的基础服务层
 * 包含单表的CURD
 * @author Beck
 *
 * @param <T>
 */
public abstract class BaseService<T extends BasePojo> {
	// 通用mapper
	// Spring4 提供泛型的注入
	@Autowired
	private Mapper<T> mapper;
	
	// 利用子类来初始化mapper 泛型注入就不需要getMapper方法了
	// public abstract Mapper<T> mapper;
	
	/**
	 * 根据主键id获取对象
	 * @param id
	 * @return
	 */
	public T queryById(Object id){
		return this.mapper.selectByPrimaryKey(id);
	}
	
	/**
	 * 查询所有的对象信息
	 * @return List
	 */
	public List<T> queryAll(){
		return this.mapper.select(null);
	}
	
	/**
	 * 根据条件：查询一个对象信息
	 * @param record
	 * @return
	 */
	public T queryOne(T record){
		return this.mapper.selectOne(record);
	}
	
	/**
	 * 根据条件查询信息
	 * @param record
	 * @return List
	 */
	public List<T> queryListByWhere(T record){
		return this.mapper.select(record);
	}
	
	/**
	 * 分页查询信息
	 * @param record 条件
	 * @param pageNum 页码
	 * @param pageSize 每页显示大小
	 * @return
	 */
	public PageInfo<T> queryPageListByWhere(T record, int pageNum, int pageSize){
		PageHelper.startPage(pageNum, pageSize);
		List<T> list = this.mapper.select(record);
		PageInfo<T> pageInfo = new PageInfo<>(list);
		
		return pageInfo;
	}
	
	/**
	 * 新增
	 * @param record
	 * @return true:新增成; false:失败
	 */
	public boolean save(T record){
		// 设置创建和更新时间
		record.setCreated(new Date());
		record.setUpdated(record.getCreated());
		int result = this.mapper.insertSelective(record);
		return result == 1;
	}
	
	/**
	 * 更新
	 * 主键不能为空
	 * @param record 
	 * @return true:新增成; false:失败
	 */
	public boolean update(T record){
		// 设置更新的时间
		record.setUpdated(new Date());
		int result = this.mapper.updateByPrimaryKeySelective(record);
		return result == 1;
	}
	
	/**
	 * 根据主键id删除对象
	 * @param id
	 * @return true:新增成; false:失败
	 */
	public boolean deleteById(Object id){
		int result = this.mapper.deleteByPrimaryKey(id);
		return result == 1;
	}
	
	/**
	 * 根据多个id删除对象
	 * @param clzz
	 * @param ids
	 * @return
	 */
	public boolean deleteByIds(Class<?> clzz, List<Object> ids){
		Example example = new Example(clzz);
		example.createCriteria().andIn("id", ids);
		int result = this.mapper.deleteByExample(example );
		return result > 0;
	}
	
	/**
	 * 根据条件删除对象信息
	 * @param record
	 * @return
	 */
	public boolean deleteByWhere(T record){
		int result = this.mapper.delete(record);
		return result > 0;
	}

}
